﻿// using System;
// using System.Collections.Generic;
// using System.IO;
// #if ToLua
// using LuaInterface;
// #elif XLua
// using XLua;
// #endif
// using Yoozoo.Managers;
// using Yoozoo.Libs;
// using System.Threading;
//
// namespace Yoozoo.Gameplay.Managers
// {
//     public class GTATcpChannelHelper:INetworkChannelHelper
//     {
//         private Dictionary<int, Type> m_protoMaps = new Dictionary<int, Type>()
//         {
//             //{10002, typeof(com.youzu.got.protocol.LoginResponse)}
//         };
//         //private ProtobufSerializer m_Serializer = new ProtobufSerializer();
//         private readonly MemoryStream m_SerializeCachedStream = new MemoryStream(1024 * 8);
//         private readonly MemoryStream m_DeserializeCachedStream = new MemoryStream(1024 * 8);
//
//         public int PacketHeaderLength
//         {
//             get { return 4; }
//         }
//
//         private bool _isGameProto = false;
//         public bool isGameProto
//         {
//             get { return _isGameProto; }
//             set { _isGameProto = value; }
//         }
//
//         /// <summary>
//         /// 发包包头部长度
//         /// </summary>
//         private const int CS_PACKAGE_HEAD_LENGTH = 6;
//
//         private const int CS_PACKAGE_RECIVE_HEAD_LENGTH = 8;
//
//         /// <summary>
//         /// 包索引
//         /// </summary>
//         public volatile int msgIndex;
//
//         void INetworkChannelHelper.Initialize(INetworkChannel networkChannel)
//         {
//             msgIndex = 0;
//         }
//
//         void INetworkChannelHelper.Shutdown()
//         {
//             
//         }
//
//         void INetworkChannelHelper.PrepareForConnecting()
//         {
//             
//         }
//
//         bool INetworkChannelHelper.SendHeartBeat()
//         {
//
//             return true;
//         }
//
//         bool INetworkChannelHelper.Serialize(Packet packet, Stream destination)
//         {
//             byte[] bytes = null;
//             if (packet.message != null)
//             {
//                 if (packet.msgId > Yoozoo.Framework.Managers.NetworkEvent.eventProtoId)
//                 {
//                     bytes = packet.message as byte[];
//                 }
//                 else
//                 {
//                     MemoryStream memoryStream = null;
//                     using (memoryStream = new MemoryStream())
//                     {
//                         //m_Serializer.Serialize(memoryStream, packet.message);
//                         bytes = memoryStream.ToArray();
//                     }
//                 }
//             }
//             if(bytes == null)
//             {
//                 return false;
//             }
//             //packet.msgId -= 10000;
//             m_SerializeCachedStream.SetLength(m_SerializeCachedStream.Capacity); // 此行防止 Array.Copy 的数据无法写入
//             m_SerializeCachedStream.Position = 0L;
//             
//             ushort msgIndex = (ushort)(Interlocked.Increment(ref this.msgIndex) & 0xFFFF);
//             if(isGameProto)
//             {
//                 byte[] source = new byte[bytes.Length + CS_PACKAGE_HEAD_LENGTH];
//                 Array.Copy(bytes, 0, source, CS_PACKAGE_HEAD_LENGTH, bytes.Length);
//                 Array.Copy(BitConverter.GetBytes(Converter.GetBigEndian((ushort)msgIndex)), 0, source, 0, 2);
//                 Array.Copy(BitConverter.GetBytes(Converter.GetBigEndian((ushort)packet.msgId)), 0, source, 2, 2);
//                 Array.Copy(BitConverter.GetBytes(Converter.GetBigEndian((ushort)0)), 0, source, 4, 2);
//                 byte[] encode = UMT.Framework.Security.EncryptAES.AESEncrypt(source);
//                 if (encode != null && encode.Length > 0)
//                 {
//                     var encodeBytes = BitConverter.GetBytes(Converter.GetBigEndian((uint)encode.Length));// BitConverter.GetBytes(msgStrBytes.Length);
//                     //发送加密的协议内容长度
//                     m_SerializeCachedStream.Write(encodeBytes, 0, 4);
//                     //加密协议数据
//                     m_SerializeCachedStream.Write(encode, 0, encode.Length);
//                 }
//                 else
//                 {
//                     return false;
//                 }
//             }
//             else
//             {
//                 //发送的协议内容长度
//                 m_SerializeCachedStream.Write(BitConverter.GetBytes(Converter.GetBigEndian((uint)(bytes.Length + CS_PACKAGE_HEAD_LENGTH))),0,4);
//                 //发送的包索引
//                 m_SerializeCachedStream.Write(BitConverter.GetBytes(Converter.GetBigEndian((ushort)msgIndex)),0,2);
//                 //发送的协议ID
//                 m_SerializeCachedStream.Write(BitConverter.GetBytes(Converter.GetBigEndian((ushort)packet.msgId)),0,2);
//                 //发送的协议ID与协议压缩前长度
//                 m_SerializeCachedStream.Write(BitConverter.GetBytes(Converter.GetBigEndian((ushort)0)),0,2);
//                 //协议数据
//                 m_SerializeCachedStream.Write(bytes, 0, bytes.Length);
//             }
//             int totalLength = (int)m_SerializeCachedStream.Position;
//             m_SerializeCachedStream.SetLength(totalLength);
//             m_SerializeCachedStream.WriteTo(destination);
//             return true;
//         }
//
//         PacketHeader INetworkChannelHelper.DeserializePacketHeader(Stream source, out object customErrorData)
//         {
//             customErrorData=null;
//             
//             byte[] totalLengthBytes = new byte[4];
//             source.Read(totalLengthBytes, 0, 4);
//             int totalLength = Converter.GetBigEndian(BitConverter.ToInt32(totalLengthBytes,0)) + CS_PACKAGE_RECIVE_HEAD_LENGTH;
//
//             return new PacketHeader()
//             {
//                 PacketLength = totalLength
//             };
//         }
//
//         Packet INetworkChannelHelper.DeserializePacket(PacketHeader packetHeader, Stream source, out object customErrorData)
//         {
//             customErrorData = null;
//             #region 丝路解析
//
//             MemoryStream ms = source as MemoryStream;
//             byte[] bytes = ms.ToArray();
//             int msgLen = packetHeader.PacketLength;
//             int offset = 0;
//             ushort msgIdx = Converter.GetBigEndian(BitConverter.ToUInt16(bytes, offset));
//             offset += 2;
//             ushort msgId = Converter.GetBigEndian(BitConverter.ToUInt16(bytes, offset));
//             offset += 2;
//             int decodeLen = Converter.GetBigEndian(BitConverter.ToInt32(bytes, offset));
//             offset += 4;
//             byte[] proto = null;
//             if (decodeLen == 0)
//             {
//                 int protoLen = msgLen - CS_PACKAGE_RECIVE_HEAD_LENGTH;
//                 proto = new byte[protoLen];
//                 Array.Copy(bytes, offset, proto, 0, protoLen);
//             }
//             else
//             {
//                 proto = new byte[decodeLen];
//
//                 int inputLen = msgLen - CS_PACKAGE_RECIVE_HEAD_LENGTH;
//                 if (LZ4.LZ4Codec.Decode(bytes, offset, inputLen, proto, 0, decodeLen) != decodeLen)
//                 {
//                     return new Packet()
//                     {
//                         msgId = msgId,
//                         message = null
//                     };
//                 }
//             }
//             if (msgId > Yoozoo.Framework.Managers.NetworkEvent.eventProtoId)
//             {
//                 return new Packet()
//                 {
//                     msgId = msgId,
// #if ToLua
//                     message = new LuaByteBuffer(proto)
// #else
//                     message = proto
// #endif
//                 };
//             }
//             else
//             {
//                 if (proto != null && m_protoMaps.ContainsKey(msgId))
//                 {
//                     //8,1,24,8,32,138,192,186,208,203,46,42,44,67,56,118,51,89,103,120,102,109,115,99,73,53,88,103,106,118,85,112,69,115,119,78,74,85,109,107,105,113,81,105,117,112,107,69,115,104,116,98,51,105,71,89,61
//                     
//                     m_DeserializeCachedStream.SetLength(m_DeserializeCachedStream.Capacity); // 此行防止 Array.Copy 的数据无法写入
//                     m_DeserializeCachedStream.Position = 0L;
//                     m_DeserializeCachedStream.Write(proto, 0, proto.Length);
//                     m_DeserializeCachedStream.Position = 0L;
//                     m_DeserializeCachedStream.SetLength(proto.Length);
//                     object obj = default;//m_Serializer.Deserialize(m_DeserializeCachedStream, null, m_protoMaps[msgId]);
//                     return new Packet()
//                     {
//                         msgId = msgId,
//                         message = obj
//                     };
//                 }
//                 else
//                 {
//                     return new Packet()
//                     {
//                         msgId = msgId,
//                         message = null
//                     };
//                 }
//             }
//            
//             #endregion
//          
//         }
//     }
// }